/**
 * 生产环境快速部署脚本
 * 帮助用户快速部署多交易所监控系统到生产环境
 */

const fs = require('fs');
const path = require('path');
const { exec } = require('child_process');

console.log('🚀 多交易所监控系统 - 生产环境部署向导\n');

async function runCommand(command, description) {
  return new Promise((resolve, reject) => {
    console.log(`🔧 ${description}...`);
    
    exec(command, (error, stdout, stderr) => {
      if (error) {
        console.log(`❌ 失败: ${error.message}`);
        reject(error);
        return;
      }
      
      if (stderr && !stderr.includes('WARN')) {
        console.log(`⚠️  警告: ${stderr}`);
      }
      
      console.log(`✅ ${description}完成`);
      if (stdout && stdout.trim()) {
        console.log(`   输出: ${stdout.trim()}`);
      }
      resolve(stdout);
    });
  });
}

async function checkFile(filePath, description) {
  if (fs.existsSync(filePath)) {
    console.log(`✅ ${description}存在`);
    return true;
  } else {
    console.log(`❌ ${description}不存在: ${filePath}`);
    return false;
  }
}

async function deployProduction() {
  try {
    console.log('📋 步骤1: 检查环境和配置\n');
    
    // 检查必要文件
    const envExists = await checkFile('.env', '.env 配置文件');
    const configExists = await checkFile('ecosystem.config.js', 'PM2 配置文件');
    
    if (!envExists) {
      console.log('\n💡 请先创建 .env 配置文件：');
      console.log('   1. 复制 config.example.env 为 .env');
      console.log('   2. 填入正确的邮件配置和交易所设置');
      console.log('   3. 运行 npm run setup 进行交互式配置');
      return;
    }
    
    if (!configExists) {
      console.log('\n❌ PM2 配置文件缺失，请重新安装项目');
      return;
    }
    
    console.log('\n📋 步骤2: 安装依赖\n');
    await runCommand('npm install --only=production', '安装生产环境依赖');
    
    console.log('\n📋 步骤3: 测试基本功能\n');
    console.log('🧪 运行基础测试...');
    
    try {
      await runCommand('npm run test-logs', '测试日志功能');
      console.log('✅ 日志系统正常');
    } catch (error) {
      console.log('⚠️  日志测试失败，但不影响主要功能');
    }
    
    console.log('\n📋 步骤4: 使用PM2启动服务\n');
    
    // 清理可能存在的进程
    try {
      await runCommand('npx pm2 delete multi-exchange-monitor', '清理旧进程');
    } catch (error) {
      // 忽略删除失败（可能进程不存在）
    }
    
    // 启动生产环境
    await runCommand('npm run pm2:start', '启动PM2进程');
    
    console.log('\n📋 步骤5: 验证部署状态\n');
    await runCommand('npm run pm2:status', '检查进程状态');
    
    console.log('\n🎉 生产环境部署成功！\n');
    
    console.log('📊 常用管理命令：');
    console.log('   查看状态:   npm run pm2:status');
    console.log('   查看日志:   npm run pm2:logs');
    console.log('   重启服务:   npm run pm2:restart');
    console.log('   停止服务:   npm run pm2:stop');
    console.log('   监控面板:   npm run pm2:monit');
    
    console.log('\n🔧 设置开机自启（可选）：');
    console.log('   1. 保存PM2进程列表: npx pm2 save');
    console.log('   2. 设置开机启动: npx pm2 startup');
    console.log('   3. 按提示执行生成的命令');
    
    console.log('\n📁 重要文件位置：');
    console.log('   配置文件: .env');
    console.log('   PM2配置: ecosystem.config.js');
    console.log('   日志目录: ./logs/');
    console.log('   数据目录: ./data/');
    
    console.log('\n💡 提示：');
    console.log('   - 修改配置后使用 npm run pm2:reload 进行0秒重启');
    console.log('   - 定时任务已设置为每天上午9点发送日报');
    console.log('   - 支持同时监控 Upbit 和 Binance 交易所');
    console.log('   - 可通过 LOG_LEVEL 环境变量控制日志详细程度');
    
  } catch (error) {
    console.log(`\n❌ 部署失败: ${error.message}`);
    console.log('\n🔧 故障排除：');
    console.log('   1. 检查 .env 配置文件是否正确');
    console.log('   2. 确保邮件服务配置有效');
    console.log('   3. 检查网络连接和防火墙设置');
    console.log('   4. 查看详细错误日志: npm run pm2:logs');
    process.exit(1);
  }
}

// 运行部署向导
deployProduction().then(() => {
  console.log('\n👋 部署向导完成');
}).catch(error => {
  console.log(`\n❌ 部署向导执行失败: ${error.message}`);
  process.exit(1);
});
